home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / comm / misc / Sashi89.lha / Sashi89 / sources / mui_tilist.c < prev    next >
C/C++ Source or Header  |  2001-05-06  |  6KB  |  233 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. #include <libraries/mui.h>
  6. #include <clib/muimaster_protos.h>
  7. #include <clib/utility_protos.h>
  8.  
  9. #include "mui_tilist.h"
  10.  
  11. // Custom class MUI
  12.  
  13. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
  14.  
  15. extern struct UtilityBase *UtilityBase;
  16.  
  17. ULONG MUITIList_Get(struct IClass *cl,Object *obj,Msg msg);
  18. ULONG MUITIList_Set(struct IClass *cl,Object *obj,Msg msg);
  19. ULONG MUITIList_ListVars(struct IClass *cl,Object *obj,Msg msg);
  20. ULONG MUITIList_ListFolders(struct IClass *cl,Object *obj,Msg msg);
  21. ULONG MUITIList_DoubleClick(struct IClass *cl,Object *obj,Msg msg);
  22. ULONG MUITIList_Update(struct IClass *cl,Object *obj,Msg msg);
  23.  
  24. ULONG MUITIList_Set(struct IClass *cl,Object *obj,Msg msg)
  25. {
  26.   struct MUITIList_Data *data = (struct MUITIList_Data *)INST_DATA(cl,obj);
  27.   struct TagItem *tags,*tag;
  28.  
  29.   for (tags=((struct opSet *)msg)->ops_AttrList;(tag=NextTagItem(&tags));)
  30.   {
  31.     switch (tag->ti_Tag)
  32.     {
  33.       case MUIA_TIList_CurrentFolder:
  34.         strncpy(data->current_folder,(char *)(tag->ti_Data),MAX_NAMELENGTH);
  35.         data->current_folder[MAX_NAMELENGTH] = '\0';
  36.         printf("Set ( %s )\n",(char *)tag->ti_Data);
  37.         //DoMethod(obj,MUIM_TIList_ListVars);
  38.         break;
  39.  
  40.       case MUIA_TIList_ParentApp:
  41.         data->app =  (Object *)(tag->ti_Data);
  42.         break;
  43.  
  44.       case MUIA_TIList_ParentWindow:
  45.         data->window =  (Object *)(tag->ti_Data);
  46.         break;
  47.     }
  48.   }
  49.   return(DoSuperMethodA(cl,obj,msg));
  50. }
  51.  
  52. ULONG MUITIList_Get(struct IClass *cl,Object *obj,Msg msg)
  53. {
  54.   struct MUITIList_Data *data = (struct MUITIList_Data *)INST_DATA(cl,obj);
  55.   ULONG *store = ((struct opGet *)msg)->opg_Storage;
  56.  
  57.   switch (((struct opGet *)msg)->opg_AttrID)
  58.   {
  59.     case MUIA_TIList_CurrentFolder:
  60.       *store = (ULONG)(&data->current_folder); /* Give a null string */
  61.       return(TRUE);
  62.     case MUIA_TIList_CurrentSelectedVar:
  63.     {
  64.       if ( data->current_folder[0] == '\0' )
  65.         *store = (ULONG)data->current_folder; /* give a null string */
  66.       else
  67.         DoMethod(obj,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,store);
  68.       return(TRUE);
  69.     }
  70.     case MUIA_TIList_CurrentSelectedFolder:
  71.     {
  72.       if ( data->current_folder[0] != '\0' )
  73.         *store = (ULONG)data->current_folder; /* give a null string */
  74.       else
  75.         DoMethod(obj,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,store);
  76.       return(TRUE);
  77.     }
  78.  
  79.     case MUIA_TIList_ParentApp:
  80.       *store = (ULONG)data->app;
  81.       return(TRUE);
  82.  
  83.     case MUIA_TIList_ParentWindow:
  84.       *store = (ULONG)data->window;
  85.       return(TRUE);
  86.   }
  87.  
  88.   return(DoSuperMethodA(cl,obj,msg));
  89. }
  90.  
  91. ULONG MUITIList_ListFolders(struct IClass *cl,Object *obj,Msg msg)
  92. {
  93.   struct MUITIList_Data *data = (struct MUITIList_Data *)INST_DATA(cl,obj);
  94.  
  95.   int nbvars, cpt;
  96.  
  97.   printf("Listing folders...");
  98.   fflush(stdout);
  99.   data->current_folder[0]=0;
  100.  
  101.   nbvars = ti_folderlist(data->vars);
  102.  
  103.   if ( nbvars < 0 )
  104.   {
  105.     MUI_Request(data->app,data->window,0,"Error while listing","*_OK",
  106.                 ti_code2string(nbvars));
  107.     printf("error %d\n",nbvars);
  108.     return(TRUE);
  109.   }
  110.  
  111.   DoMethod(obj,MUIM_List_Clear);
  112.  
  113.   for ( cpt=0; cpt<nbvars; cpt++ )
  114.     DoMethod(obj,MUIM_List_InsertSingle,data->vars[cpt].name,MUIV_List_Insert_Bottom);
  115.  
  116.   /*SetAttrs((APTR)text_ti89,MUIA_Text_Contents,(ULONG)"TI89 : list of folders",TAG_DONE);*/
  117.   printf("OK\n");
  118.   return(TRUE);
  119. }
  120.  
  121.  
  122. ULONG MUITIList_ListVars(struct IClass *cl,Object *obj,Msg msg)
  123. {
  124.   struct MUITIList_Data *data = (struct MUITIList_Data *)INST_DATA(cl,obj);
  125.  
  126.   if ( data->current_folder[0] )
  127.   {
  128.     int nbvars, cpt;
  129.  
  130.         /*printf(HERE"  Listing folder %s...",data->current_folder);
  131.         fflush(stdout);*/
  132.  
  133.     nbvars = ti_listdir(data->current_folder,data->vars);
  134.  
  135.     if ( nbvars < 0 )
  136.     {
  137.       MUI_Request(data->app,data->window,0,"Error while listing","*_OK",
  138.                 ti_code2string(nbvars));
  139.       return(TRUE);
  140.     }
  141.  
  142.     DoMethod(obj,MUIM_List_Clear);
  143.  
  144.     DoMethod(obj,MUIM_List_InsertSingle,"..",MUIV_List_Insert_Bottom);
  145.  
  146.     for ( cpt=0; cpt<nbvars; cpt++ )
  147.             if ( ti_isvariable(data->vars[cpt].type ) )
  148.                 DoMethod(obj,MUIM_List_InsertSingle,data->vars[cpt].name,MUIV_List_Insert_Bottom);
  149.  
  150.         /*printf(HERE"OK\n");*/
  151.   }
  152.   return(TRUE);
  153. }
  154.  
  155. ULONG MUITIList_DoubleClick(struct IClass *cl,Object *obj,Msg msg)
  156. {
  157.   char *whatisclicked;
  158.   struct MUITIList_Data *data = (struct MUITIList_Data *)INST_DATA(cl,obj);
  159.  
  160.   DoMethod(obj,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&whatisclicked);
  161.  
  162.     //printf(HERE"Double click sur <%s>(%p), cf = <%s>\n",whatisclicked,whatisclicked,data->current_folder);
  163.  
  164.   if ( ! whatisclicked )
  165.     return(TRUE);
  166.  
  167.   if ( data->current_folder[0] == '\0' )
  168.   {
  169.     strncpy(data->current_folder,whatisclicked,MAX_NAMELENGTH);
  170.  
  171.     /*
  172.     sprintf(text_buffer,"TI89 : %s",data->current_folder);
  173.     SetAttrs((APTR)text_ti89,MUIA_Text_Contents,(ULONG)text_buffer,TAG_DONE);
  174.     DoMethod(App,MUIM_Application_ReturnID,LISTVARS_UPDATE);
  175.     */
  176.     DoMethod(obj,MUIM_TIList_ListVars);
  177.   }
  178.   else
  179.     if ( whatisclicked[0] == '.' )
  180.       DoMethod(obj,MUIM_TIList_ListFolders);
  181.  
  182.   return(TRUE);
  183. }
  184.  
  185. ULONG MUITIList_Update(struct IClass *cl,Object *obj,Msg msg)
  186. {
  187.   struct MUITIList_Data *data = (struct MUITIList_Data *)INST_DATA(cl,obj);
  188.  
  189.   if ( data->current_folder[0] )
  190.     DoMethod(obj,MUIM_TIList_ListVars);
  191.   else
  192.     DoMethod(obj,MUIM_TIList_ListFolders);
  193.  
  194.   return(TRUE);
  195. }
  196.  
  197. ULONG __attribute__((regparm(3))) MUITIList_Dispatcher(struct IClass *cl ,  Msg msg,Object *obj  )
  198. {
  199. //  printf("Dispatcher ( %x )\n",msg->MethodID);
  200.   switch (msg->MethodID)
  201.   {
  202.     case OM_NEW :
  203.       {
  204.         Object *obj2=(Object *)DoSuperMethodA(cl,obj,(Msg)msg);
  205.         if ( obj2 )
  206.         {
  207.           //printf("OM_NEW...\n");
  208.           DoMethod(obj2, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE,
  209.                MUIV_Notify_Self, 1, MUIM_TIList_DoubleClick);
  210.           return((ULONG)obj2);
  211.         }
  212.       }
  213.       break;
  214.  
  215.     case OM_SET :
  216.       return(MUITIList_Set(cl,obj,msg));
  217.     case OM_GET :
  218.       return(MUITIList_Get(cl,obj,msg));
  219.     case MUIM_TIList_DoubleClick:
  220.       return(MUITIList_DoubleClick(cl,obj,msg));
  221.     case MUIM_TIList_ListVars :
  222.       return(MUITIList_ListVars(cl,obj,msg));
  223.     case MUIM_TIList_ListFolders :
  224.       return(MUITIList_ListFolders(cl,obj,msg));
  225.     case MUIM_TIList_Update :
  226.       return(MUITIList_Update(cl,obj,msg));
  227.   }
  228.  
  229.   return(DoSuperMethodA(cl,obj,(Msg)msg));
  230. }
  231.  
  232.  
  233.